//
//  Problem1309.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/15.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1309. 解码字母到整数映射 【ascii】
 给你一个字符串 s，它由数字（'0' - '9'）和 '#' 组成。我们希望按下述规则将 s 映射为一些小写英文字符：

 字符（'a' - 'i'）分别用（'1' - '9'）表示。
 字符（'j' - 'z'）分别用（'10#' - '26#'）表示。
 返回映射之后形成的新字符串。

 题目数据保证映射始终唯一。

 示例 1：
     输入：s = "10#11#12"
     输出："jkab"
     解释："j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2".
 示例 2：
     输入：s = "1326#"
     输出："acz"
 示例 3：
     输入：s = "25#"
     输出："y"
 示例 4：
     输入：s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#"
     输出："abcdefghijklmnopqrstuvwxyz"
 提示：
     1 <= s.length <= 1000
     s[i] 只包含数字（'0'-'9'）和 '#' 字符。
     s 是映射始终存在的有效字符串。

 */
@objcMembers class Problem1309: NSObject {
    func solution() {
        print(freqAlphabets("10#11#12"))
        print(freqAlphabets("1326#"))
        print(freqAlphabets("25#"))
        print(freqAlphabets("12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#"))
    }
    
    /*
     1: 创建2个临时变量， first, second
     2: 遍历字符串，当遇到普通字符时，暂存在临时变量中，当first有值时，转换
     3: 遇到#所有first和second需要合租，转换
     */
    func freqAlphabets(_ s: String) -> String {
        var charts:[Character] = []
        
        var first:Character? = nil
        var second:Character? = nil
        for c in s {
            if c == "#" {
                var ascii:UInt8 = 0
                if first != nil {
                    ascii += (first!.asciiValue! - 48) * 10
                }
                if second != nil {
                    ascii += second!.asciiValue! - 48
                }
                
                charts.append(Character(Unicode.Scalar(ascii + 96)))
                first = nil
                second = nil
            } else {
                if first != nil {
                    charts.append(Character(Unicode.Scalar(first!.asciiValue! - 49 + 97)))
                }
                first = second
                second = c
            }
        }
        if first != nil {
            charts.append(Character(Unicode.Scalar(first!.asciiValue! - 49 + 97)))
        }
        if second != nil {
            charts.append(Character(Unicode.Scalar(second!.asciiValue! - 49 + 97)))
        }
        return String(charts)
    }
    
    func addChart(_ charts:inout [Character], _ first: Character?, _ second: Character?, _ current: Character) {
        if let safeFirst = first  {
            charts.append(safeFirst)
        }
        if let safeSecond = second {
            charts.append(safeSecond)
        }
//        if let safeCurrent = current {
//            charts.append(safeCurrent)
//        }
    }
}
